package code;
//1服务端代码：

//import code_test.audioUtils;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


/*
 * 双向通信的服务端.
 */
public class Server extends JFrame implements ActionListener {
private    static String path;//接收文件的路径
private    static String savepath;//保存文件的路径
    
        JPanel jp1, jp2, jp3,jp4;
        JLabel jl1 = null;
        JButton captureBtn, stopBtn, playBtn, saveBtn,sendBtn,setButton;
      //连接信息和录音信息
        JLabel linkLabel=null;
        JLabel rdLabel=null;
        JLabel ipLabel=null;
        //路径信息
        JTextField  repath,svpath;
        //定义初始音频类
       audioUtils server=null;
       //获取本地IP
       InetAddress ia=null;
       
       Socket s=null;
     // 构造函数
        public  Server() throws UnknownHostException {
            // 组件初始化
            jp1 = new JPanel();
            jp2 = new JPanel();
            jp3 = new JPanel();
            jp4=new JPanel();
            //文本框初始化
            repath=new JTextField("E:\\JAVA2022\\javaSE\\毕设\\src\\voice\\serverReceived");
//        repath=new JTextField("输入接收录音文件保存的路径");
            svpath=new JTextField("E:\\JAVA2022\\javaSE\\毕设\\src\\voice\\serverSend");
//        svpath=new JTextField("输入要保存的录音文件路径");
//              repath=new JTextField("输入接收录音文件保存的路径");
//               svpath=new JTextField("输入要保存的录音文件路径");
            //定义连接和录音提示
             linkLabel=new JLabel("未连接");
             rdLabel=new JLabel("");
             ipLabel=new JLabel("本地IP："+ia.getLocalHost().getHostAddress());
            
             // 定义字体
            Font myFont = new Font("宋体", Font.BOLD, 30);
            jl1 = new JLabel("实时通信系统服务端");
            jl1.setFont(myFont);
        
            captureBtn = new JButton("开始录音");
            // 对开始录音按钮进行注册监听
            captureBtn.addActionListener(this);
            captureBtn.setActionCommand("captureBtn");
            // 对停止录音进行注册监听
            stopBtn = new JButton("停止录音");
            stopBtn.addActionListener(this);
            stopBtn.setActionCommand("stopBtn");
            // 对播放录音进行注册监听
            playBtn = new JButton("播放录音");
            playBtn.addActionListener(this);
            playBtn.setActionCommand("playBtn");
            // 对保存录音进行注册监听
            saveBtn = new JButton("保存录音");
            saveBtn.addActionListener(this);
            saveBtn.setActionCommand("saveBtn");
            //对发送录音进行注册监听
            sendBtn=new JButton("发送录音");
            sendBtn.addActionListener(this);
            sendBtn.setActionCommand("sendBtn");
            //对设置ip，路径等监听
            setButton=new JButton("保存设置");
            setButton.addActionListener(this);
            setButton.setActionCommand("setButton");
            
            
            this.add(jp1, BorderLayout.NORTH);
            this.add(jp2, BorderLayout.CENTER);
            this.add(jp3, BorderLayout.SOUTH);
            this.add(jp4,BorderLayout.NORTH);
            jp3.setLayout(null);
            jp3.setLayout(new GridLayout(1, 4, 10, 10));
            jp2.add(rdLabel);
            jp2.add(linkLabel);
            jp2.add(ipLabel);
            jp3.add(captureBtn);
            jp3.add(stopBtn);
            jp3.add(playBtn);
            jp3.add(saveBtn);
            jp3.add(sendBtn);
            jp4.add(svpath);
            jp4.add(repath);
            jp4.add(setButton);
            // 设置按钮的属性
            this.captureBtn.setEnabled(false);
            this.stopBtn.setEnabled(false);
            this.playBtn.setEnabled(false);
            this.saveBtn.setEnabled(false);
            this.sendBtn.setEnabled(false);
            // 设置窗口的属性
            this.setSize(700, 500);
            this.setTitle("服务端");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
            this.setVisible(true);
            
            try {
                server=new audioUtils();
                //等待连接
                ServerSocket ss=new ServerSocket(50000);
                //阻塞方法，一直等待客户端接入
                while(true){
                //监听连接
                    s=ss.accept();
                    JOptionPane.showMessageDialog(null, "连接成功....");
                    System.out.println("已经连接");
                    linkLabel.setText("已连接:");
                    //开启一个接收文件的线程
                    server.recied(s, new File(path));
            }
                
            }
            catch (Exception e) {
            e.printStackTrace();
            linkLabel.setText("未连接:");
            }
             
        }
            
        //事件
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("captureBtn")) {
                // 点击开始录音按钮后的动作
                // 停止按钮可以启动
                captureBtn.setEnabled(false);
                stopBtn.setEnabled(true);
                playBtn.setEnabled(false);
                saveBtn.setEnabled(false);
                sendBtn.setEnabled(false);
                
                // 调用录音的方法
                capture();
                rdLabel.setText("正在录音..");
            } else if (e.getActionCommand().equals("stopBtn")) {
                // 点击停止录音按钮的动作
                captureBtn.setEnabled(true);
                stopBtn.setEnabled(false);
                playBtn.setEnabled(true);
                saveBtn.setEnabled(true);
                if(s!=null)
                    sendBtn.setEnabled(true);    
                
                // 调用停止录音的方法
                stop();
                rdLabel.setText("完成录音..");
                }
             else if (e.getActionCommand().equals("playBtn")) {
                // 调用播放录音的方法
                play();
            } else if (e.getActionCommand().equals("saveBtn")) {
                // 调用保存录音的方法
                rdLabel.setText("保存录音...");
                save();
                
            }else if(e.getActionCommand().equals("sendBtn")){
                //调用发送录音的方法
                rdLabel.setText("发送录音");
                send();
                
            }else if(e.getActionCommand().equals("setButton")){
                
                 path=repath.getText().trim();
                 savepath=svpath.getText().trim();
                 if(new File(savepath).isDirectory())
                 {
                     savepath+="/"+System.currentTimeMillis()+".mp3";
                     this.captureBtn.setEnabled(true);
                 }else{
                     svpath.setText("文件路径不存在!");
                     return ;
                 }
                 
                 if(new File(path).isDirectory())
                 {
                     path+="/recied.mp3";
                 }else{
                     repath.setText("文件路径不存在!");
                     return ;
                 }
                 
              
                this.setButton.setEnabled(false);
                 JOptionPane.showMessageDialog(null, "设置成功");
            }
        }
        
        //开始录音
        public void capture()        //录音代码
        {
              server.capture();
        }
        
        // 停止录音
        public void stop() {
           server.stop();
        }
        
        // 播放录音
        public void play(){
        server.play();
        }

        // 保存录音
        public void save() {
            // 取得录音输入流
            server.save(new File(savepath));
        }
        
    //发送录音到客户端（不保存到本地文件的发送)
        public void send()
        {
            server.send();
        }
        
        

    public static void main(String []args){
        try {
            Server ss=new Server();
        } catch (UnknownHostException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
}